﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace YJTTool.Common.Managers
{
   public class TimerTaskManager
    {
        private List<ScheduledTask> _scheduledTasks;

        public TimerTaskManager()
        {
            _scheduledTasks = new List<ScheduledTask>();
        }
        // 添加定时任务
        public void AddTask(ScheduledTask task)
        {
            _scheduledTasks.Add(task);
        }

        // 每次登录时调用，循环任务列表，创建并启动定时器
        public void StartTasks()
        {
            foreach (var task in _scheduledTasks)
            {
                StartTaskTimer(task);
            }
        }

        // 为每个任务创建并启动定时器
        private void StartTaskTimer(ScheduledTask task)
        {
            var now = DateTime.Now;
            var targetTime = DateTime.Today.Add(task.TaskTime);

            // 如果目标时间已经过去，设置为明天同一时间
            if (targetTime <= now)
            {
                targetTime = targetTime.AddDays(1);
            }

            var initialDelay = targetTime - now;

            // 创建并启动定时器，延迟到目标时间后触发
            Timer taskTimer = new Timer(initialDelay.TotalMilliseconds);
            taskTimer.Elapsed += (sender, e) =>
            {
                ExecuteTask(task); // 执行任务
                StartRepeatingTask(task); // 启动重复任务
            };
            taskTimer.AutoReset = false; // 确保定时器只触发一次
            taskTimer.Start();
        }

        // 执行任务的方法
        private void ExecuteTask(ScheduledTask task)
        {
            Console.WriteLine($"执行任务：{task.TaskTime}");
            task.TaskAction.Invoke(); // 执行任务的方法
        }
        // 启动重复执行的任务
        private void StartRepeatingTask(ScheduledTask task)
        {
            if (task.RepeatCount <= 0)
                return;

            Timer repeatTimer = new Timer(task.Interval.TotalMilliseconds);
            int executionCount = 0;

            repeatTimer.Elapsed += (sender, e) =>
            {
                if (executionCount < task.RepeatCount)
                {
                    executionCount++;
                    Console.WriteLine($"重复执行任务，第 {executionCount} 次");
                    task.TaskAction.Invoke();
                }
                else
                {
                    repeatTimer.Stop(); // 停止重复定时器
                    Console.WriteLine("任务执行完成");
                }
            };
            repeatTimer.AutoReset = true; // 设置为自动触发
            repeatTimer.Start();
        }

    }
    public class ScheduledTask
    {
        public TimeSpan TaskTime { get; set; } // 任务的执行时间（例如：每天18:00）
        public int RepeatCount { get; set; }  // 任务执行的重复次数
        public TimeSpan Interval { get; set; } // 任务重复执行的间隔（例如：5分钟）
        public Action TaskAction { get; set; } // 任务执行的方法

        public ScheduledTask(TimeSpan taskTime, int repeatCount, TimeSpan interval, Action taskAction)
        {
            TaskTime = taskTime;
            RepeatCount = repeatCount;
            Interval = interval;
            TaskAction = taskAction;
        }
    }
}
